Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


sx127x.cpp c467b820144d2cfbeb82e1bacf8ad1468234d1fa (c467b820) Text, 15.69 KB

T8b949e// Copyright Sandeep Mistry, Mark Qvist and Jacob Eva.
T8b949e// Licensed under the MIT license.

Tff7b72#Tff7b72include T8b949e"Boards.h"

Tff7b72#Tff7b72if MODEM == SX1276
Tff7b72#Tff7b72include T8b949e"sx127x.h"

Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32 and !defined(CONFIG_IDF_TARGET_ESP32S3)
Tff7b72#Tff7b72include T8b949e"hal/wdt_hal.h"
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define ISR_VECT IRAM_ATTR
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define ISR_VECT
Tff7b72#Tff7b72endif

T8b949e// Registers
Tff7b72#Tff7b72define REG_FIFO_7X 0x00
Tff7b72#Tff7b72define REG_OP_MODE_7X 0x01
Tff7b72#Tff7b72define REG_FRF_MSB_7X 0x06
Tff7b72#Tff7b72define REG_FRF_MID_7X 0x07
Tff7b72#Tff7b72define REG_FRF_LSB_7X 0x08
Tff7b72#Tff7b72define REG_PA_CONFIG_7X 0x09
Tff7b72#Tff7b72define REG_OCP_7X 0x0b
Tff7b72#Tff7b72define REG_LNA_7X 0x0c
Tff7b72#Tff7b72define REG_FIFO_ADDR_PTR_7X 0x0d
Tff7b72#Tff7b72define REG_FIFO_TX_BASE_ADDR_7X 0x0e
Tff7b72#Tff7b72define REG_FIFO_RX_BASE_ADDR_7X 0x0f
Tff7b72#Tff7b72define REG_FIFO_RX_CURRENT_ADDR_7X 0x10
Tff7b72#Tff7b72define REG_IRQ_FLAGS_7X 0x12
Tff7b72#Tff7b72define REG_RX_NB_BYTES_7X 0x13
Tff7b72#Tff7b72define REG_MODEM_STAT_7X 0x18
Tff7b72#Tff7b72define REG_PKT_SNR_VALUE_7X 0x19
Tff7b72#Tff7b72define REG_PKT_RSSI_VALUE_7X 0x1a
Tff7b72#Tff7b72define REG_RSSI_VALUE_7X 0x1b
Tff7b72#Tff7b72define REG_MODEM_CONFIG_1_7X 0x1d
Tff7b72#Tff7b72define REG_MODEM_CONFIG_2_7X 0x1e
Tff7b72#Tff7b72define REG_PREAMBLE_MSB_7X 0x20
Tff7b72#Tff7b72define REG_PREAMBLE_LSB_7X 0x21
Tff7b72#Tff7b72define REG_PAYLOAD_LENGTH_7X 0x22
Tff7b72#Tff7b72define REG_MODEM_CONFIG_3_7X 0x26
Tff7b72#Tff7b72define REG_FREQ_ERROR_MSB_7X 0x28
Tff7b72#Tff7b72define REG_FREQ_ERROR_MID_7X 0x29
Tff7b72#Tff7b72define REG_FREQ_ERROR_LSB_7X 0x2a
Tff7b72#Tff7b72define REG_RSSI_WIDEBAND_7X 0x2c
Tff7b72#Tff7b72define REG_DETECTION_OPTIMIZE_7X 0x31
Tff7b72#Tff7b72define REG_HIGH_BW_OPTIMIZE_1_7X 0x36
Tff7b72#Tff7b72define REG_DETECTION_THRESHOLD_7X 0x37
Tff7b72#Tff7b72define REG_SYNC_WORD_7X 0x39
Tff7b72#Tff7b72define REG_HIGH_BW_OPTIMIZE_2_7X 0x3a
Tff7b72#Tff7b72define REG_DIO_MAPPING_1_7X 0x40
Tff7b72#Tff7b72define REG_VERSION_7X 0x42
Tff7b72#Tff7b72define REG_TCXO_7X 0x4b
Tff7b72#Tff7b72define REG_PA_DAC_7X 0x4d

T8b949e// Modes
Tff7b72#Tff7b72define MODE_LONG_RANGE_MODE_7X 0x80
Tff7b72#Tff7b72define MODE_SLEEP_7X 0x00
Tff7b72#Tff7b72define MODE_STDBY_7X 0x01
Tff7b72#Tff7b72define MODE_TX_7X 0x03
Tff7b72#Tff7b72define MODE_RX_CONTINUOUS_7X 0x05
Tff7b72#Tff7b72define MODE_RX_SINGLE_7X 0x06

T8b949e// PA config
Tff7b72#Tff7b72define PA_BOOST_7X 0x80

T8b949e// IRQ masks
Tff7b72#Tff7b72define IRQ_TX_DONE_MASK_7X 0x08
Tff7b72#Tff7b72define IRQ_RX_DONE_MASK_7X 0x40
Tff7b72#Tff7b72define IRQ_PAYLOAD_CRC_ERROR_MASK_7X 0x20

Tff7b72#Tff7b72define SYNC_WORD_7X 0x12
Tff7b72#Tff7b72define MAX_PKT_LENGTH 255

Tff7b72extern Te6edf3SPIClass Te6edf3SPITb4b4b4;

Te6edf3sx127xTff7b72:Tff7b72:Te6edf3sx127xTb4b4b4(Tb4b4b4) Tff7b72:
Te6edf3_spiSettingsTb4b4b4(T79c0ff8E6Tb4b4b4, Te6edf3MSBFIRSTTb4b4b4, Te6edf3SPI_MODE0Tb4b4b4)Tb4b4b4,
Te6edf3_ssTb4b4b4(Te6edf3LORA_DEFAULT_SS_PINTb4b4b4)Tb4b4b4, Te6edf3_resetTb4b4b4(Te6edf3LORA_DEFAULT_RESET_PINTb4b4b4)Tb4b4b4, Te6edf3_dio0Tb4b4b4(Te6edf3LORA_DEFAULT_DIO0_PINTb4b4b4)Tb4b4b4,
Te6edf3_frequencyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3_packetIndexTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3_preinit_doneTb4b4b4(Tffa657falseTb4b4b4)Tb4b4b4, Te6edf3_onReceiveTb4b4b4(Tffa657NULLTb4b4b4) Tb4b4b4{ Te6edf3setTimeoutTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4; Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3setSPIFrequencyTb4b4b4(Tffa657uint32_t Te6edf3frequencyTb4b4b4) Tb4b4b4{ Te6edf3_spiSettings Tff7b72= Te6edf3SPISettingsTb4b4b4(Te6edf3frequencyTb4b4b4, Te6edf3MSBFIRSTTb4b4b4, Te6edf3SPI_MODE0Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3setPinsTb4b4b4(Tffa657int Te6edf3ssTb4b4b4, Tffa657int Te6edf3resetTb4b4b4, Tffa657int Te6edf3dio0Tb4b4b4, Tffa657int Te6edf3busyTb4b4b4) Tb4b4b4{ Te6edf3_ss Tff7b72= Te6edf3ssTb4b4b4; Te6edf3_reset Tff7b72= Te6edf3resetTb4b4b4; Te6edf3_dio0 Tff7b72= Te6edf3dio0Tb4b4b4; Te6edf3_busy Tff7b72= Te6edf3busyTb4b4b4; Tb4b4b4}
Tffa657uint8_t Te6edf3ISR_VECT Te6edf3sx127xTff7b72:Tff7b72:Te6edf3readRegisterTb4b4b4(Tffa657uint8_t Te6edf3addressTb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3singleTransferTb4b4b4(Te6edf3address Tff7b72& T79c0ff0x7fTb4b4b4, T79c0ff0x00Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3writeRegisterTb4b4b4(Tffa657uint8_t Te6edf3addressTb4b4b4, Tffa657uint8_t Te6edf3valueTb4b4b4) Tb4b4b4{ Te6edf3singleTransferTb4b4b4(Te6edf3address Tff7b72| T79c0ff0x80Tb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3standbyTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3writeRegisterTb4b4b4(Te6edf3REG_OP_MODE_7XTb4b4b4, Te6edf3MODE_LONG_RANGE_MODE_7X Tff7b72| Te6edf3MODE_STDBY_7XTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3sleepTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3writeRegisterTb4b4b4(Te6edf3REG_OP_MODE_7XTb4b4b4, Te6edf3MODE_LONG_RANGE_MODE_7X Tff7b72| Te6edf3MODE_SLEEP_7XTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3setSyncWordTb4b4b4(Tffa657uint8_t Te6edf3swTb4b4b4) Tb4b4b4{ Te6edf3writeRegisterTb4b4b4(Te6edf3REG_SYNC_WORD_7XTb4b4b4, Te6edf3swTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3enableCrcTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_2_7XTb4b4b4, Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_2_7XTb4b4b4) Tff7b72| T79c0ff0x04Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3disableCrcTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_2_7XTb4b4b4, Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_2_7XTb4b4b4) Tff7b72& T79c0ff0xfbTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3enableTCXOTb4b4b4(Tb4b4b4) Tb4b4b4{ Tffa657uint8_t Te6edf3tcxo_reg Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_TCXO_7XTb4b4b4)Tb4b4b4; Te6edf3writeRegisterTb4b4b4(Te6edf3REG_TCXO_7XTb4b4b4, Te6edf3tcxo_reg Tff7b72| T79c0ff0x10Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3disableTCXOTb4b4b4(Tb4b4b4) Tb4b4b4{ Tffa657uint8_t Te6edf3tcxo_reg Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_TCXO_7XTb4b4b4)Tb4b4b4; Te6edf3writeRegisterTb4b4b4(Te6edf3REG_TCXO_7XTb4b4b4, Te6edf3tcxo_reg Tff7b72& T79c0ff0xEFTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3explicitHeaderModeTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3_implicitHeaderMode Tff7b72= T79c0ff0Tb4b4b4; Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4, Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4) Tff7b72& T79c0ff0xfeTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3implicitHeaderModeTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3_implicitHeaderMode Tff7b72= T79c0ff1Tb4b4b4; Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4, Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4) Tff7b72| T79c0ff0x01Tb4b4b4)Tb4b4b4; Tb4b4b4}
Te6edf3byte Te6edf3sx127xTff7b72:Tff7b72:Te6edf3randomTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3readRegisterTb4b4b4(Te6edf3REG_RSSI_WIDEBAND_7XTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3flushTb4b4b4(Tb4b4b4) Tb4b4b4{ Tb4b4b4}

Tffa657bool Te6edf3sx127xTff7b72:Tff7b72:Te6edf3preInitTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_T3S3
Te6edf3SPITb4b4b4.Te6edf3beginTb4b4b4(Te6edf3pin_sclkTb4b4b4, Te6edf3pin_misoTb4b4b4, Te6edf3pin_mosiTb4b4b4, Te6edf3pin_csTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3SPITb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif

T8b949e// Check modem version
Tffa657uint8_t Te6edf3versionTb4b4b4;
Tffa657long Te6edf3start Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72while Tb4b4b4(Tb4b4b4(Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3startTb4b4b4) Tff7b72< T79c0ff500Tb4b4b4) Tff7b72&Tff7b72& Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3startTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3version Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_VERSION_7XTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3version Tff7b72=Tff7b72= T79c0ff0x12Tb4b4b4) Tb4b4b4{ Tff7b72breakTb4b4b4; Tb4b4b4}
Te6edf3delayTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3version Tff7b72!Tff7b72= T79c0ff0x12Tb4b4b4) Tb4b4b4{ Tff7b72return Tffa657falseTb4b4b4; Tb4b4b4}
Te6edf3_preinit_done Tff7b72= Tffa657trueTb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}

Tffa657uint8_t Te6edf3ISR_VECT Te6edf3sx127xTff7b72:Tff7b72:Te6edf3singleTransferTb4b4b4(Tffa657uint8_t Te6edf3addressTb4b4b4, Tffa657uint8_t Te6edf3valueTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3responseTb4b4b4;

Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3addressTb4b4b4)Tb4b4b4;
Te6edf3response Tff7b72= Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3responseTb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3sx127xTff7b72:Tff7b72:Te6edf3beginTb4b4b4(Tffa657long Te6edf3frequencyTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_reset Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_resetTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_resetTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_resetTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3_busy Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{ Te6edf3pinModeTb4b4b4(Te6edf3_busyTb4b4b4, Te6edf3INPUTTb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_preinit_doneTb4b4b4) Tb4b4b4{ Tff7b72if Tb4b4b4(Tff7b72!Te6edf3preInitTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Tff7b72return Tffa657falseTb4b4b4; Tb4b4b4} Tb4b4b4}

Te6edf3sleepTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3setFrequencyTb4b4b4(Te6edf3frequencyTb4b4b4)Tb4b4b4;

T8b949e// Set base addresses
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FIFO_TX_BASE_ADDR_7XTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FIFO_RX_BASE_ADDR_7XTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;

T8b949e// Set LNA boost and auto AGC
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_LNA_7XTb4b4b4, Te6edf3readRegisterTb4b4b4(Te6edf3REG_LNA_7XTb4b4b4) Tff7b72| T79c0ff0x03Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_3_7XTb4b4b4, T79c0ff0x04Tb4b4b4)Tb4b4b4;

Te6edf3setSyncWordTb4b4b4(Te6edf3SYNC_WORD_7XTb4b4b4)Tb4b4b4;
Te6edf3enableCrcTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3setTxPowerTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;

Te6edf3standbyTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3endTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3sleepTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3SPITb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3_preinit_done Tff7b72= Tffa657falseTb4b4b4; Tb4b4b4}

Tffa657int Te6edf3sx127xTff7b72:Tff7b72:Te6edf3beginPacketTb4b4b4(Tffa657int Te6edf3implicitHeaderTb4b4b4) Tb4b4b4{
Te6edf3standbyTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3implicitHeaderTb4b4b4) Tb4b4b4{ Te6edf3implicitHeaderModeTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72else Tb4b4b4{ Te6edf3explicitHeaderModeTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}

T8b949e// Reset FIFO address and payload length
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FIFO_ADDR_PTR_7XTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_PAYLOAD_LENGTH_7XTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;

Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3sx127xTff7b72:Tff7b72:Te6edf3endPacketTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Enter TX mode
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_OP_MODE_7XTb4b4b4, Te6edf3MODE_LONG_RANGE_MODE_7X Tff7b72| Te6edf3MODE_TX_7XTb4b4b4)Tb4b4b4;

T8b949e// Wait for TX completion
Tff7b72while Tb4b4b4(Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_IRQ_FLAGS_7XTb4b4b4) Tff7b72& Te6edf3IRQ_TX_DONE_MASK_7XTb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3yieldTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// Clear TX complete IRQ
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_IRQ_FLAGS_7XTb4b4b4, Te6edf3IRQ_TX_DONE_MASK_7XTb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}

Tffa657bool Te6edf3sx127xTff7b72:Tff7b72:Te6edf3dcdTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657bool Te6edf3carrier_detected Tff7b72= Tffa657falseTb4b4b4;
Tffa657uint8_t Te6edf3status Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_STAT_7XTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3status Tff7b72& Te6edf3SIG_DETECTTb4b4b4) Tff7b72=Tff7b72= Te6edf3SIG_DETECTTb4b4b4) Tb4b4b4{ Te6edf3carrier_detected Tff7b72= Tffa657trueTb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3status Tff7b72& Te6edf3SIG_SYNCEDTb4b4b4) Tff7b72=Tff7b72= Te6edf3SIG_SYNCEDTb4b4b4) Tb4b4b4{ Te6edf3carrier_detected Tff7b72= Tffa657trueTb4b4b4; Tb4b4b4}
Tff7b72return Te6edf3carrier_detectedTb4b4b4;
Tb4b4b4}

Tffa657uint8_t Te6edf3sx127xTff7b72:Tff7b72:Te6edf3currentRssiRawTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3rssi Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_RSSI_VALUE_7XTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3rssiTb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3ISR_VECT Te6edf3sx127xTff7b72:Tff7b72:Te6edf3currentRssiTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3rssi Tff7b72= Tb4b4b4(Tffa657intTb4b4b4)Te6edf3readRegisterTb4b4b4(Te6edf3REG_RSSI_VALUE_7XTb4b4b4) Tff7b72- Te6edf3RSSI_OFFSETTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_frequency Tff7b72< T79c0ff820E6Tb4b4b4) Te6edf3rssi Tff7b72-Tff7b72= T79c0ff7Tb4b4b4;
Tff7b72return Te6edf3rssiTb4b4b4;
Tb4b4b4}

Tffa657uint8_t Te6edf3sx127xTff7b72:Tff7b72:Te6edf3packetRssiRawTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3pkt_rssi_value Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_PKT_RSSI_VALUE_7XTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3pkt_rssi_valueTb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3ISR_VECT Te6edf3sx127xTff7b72:Tff7b72:Te6edf3packetRssiTb4b4b4(Tffa657uint8_t Te6edf3pkt_snr_rawTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3pkt_rssi Tff7b72= Tb4b4b4(Tffa657intTb4b4b4)Te6edf3readRegisterTb4b4b4(Te6edf3REG_PKT_RSSI_VALUE_7XTb4b4b4) Tff7b72- Te6edf3RSSI_OFFSETTb4b4b4;
Tffa657int Te6edf3pkt_snr Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3pkt_snr_rawTb4b4b4)Tff7b72*T79c0ff0.25Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3_frequency Tff7b72< T79c0ff820E6Tb4b4b4) Te6edf3pkt_rssi Tff7b72-Tff7b72= T79c0ff7Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3pkt_snr Tff7b72< T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3pkt_rssi Tff7b72+Tff7b72= Te6edf3pkt_snrTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Slope correction is (16/15)*pkt_rssi,
T8b949e// this estimation looses one floating point
T8b949e// operation, and should be precise enough.
Te6edf3pkt_rssi Tff7b72= Tb4b4b4(Tffa657intTb4b4b4)Tb4b4b4(T79c0ff1.066 Tff7b72* Te6edf3pkt_rssiTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3pkt_rssiTb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3ISR_VECT Te6edf3sx127xTff7b72:Tff7b72:Te6edf3packetRssiTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3pkt_rssi Tff7b72= Tb4b4b4(Tffa657intTb4b4b4)Te6edf3readRegisterTb4b4b4(Te6edf3REG_PKT_RSSI_VALUE_7XTb4b4b4) Tff7b72- Te6edf3RSSI_OFFSETTb4b4b4;
Tffa657int Te6edf3pkt_snr Tff7b72= Te6edf3packetSnrTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3_frequency Tff7b72< T79c0ff820E6Tb4b4b4) Te6edf3pkt_rssi Tff7b72-Tff7b72= T79c0ff7Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3pkt_snr Tff7b72< T79c0ff0Tb4b4b4) Tb4b4b4{ Te6edf3pkt_rssi Tff7b72+Tff7b72= Te6edf3pkt_snrTb4b4b4; Tb4b4b4}
Tff7b72else Tb4b4b4{
T8b949e// Slope correction is (16/15)*pkt_rssi,
T8b949e// this estimation looses one floating point
T8b949e// operation, and should be precise enough.
Te6edf3pkt_rssi Tff7b72= Tb4b4b4(Tffa657intTb4b4b4)Tb4b4b4(T79c0ff1.066 Tff7b72* Te6edf3pkt_rssiTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3pkt_rssiTb4b4b4;
Tb4b4b4}

Tffa657uint8_t Te6edf3ISR_VECT Te6edf3sx127xTff7b72:Tff7b72:Te6edf3packetSnrRawTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3readRegisterTb4b4b4(Te6edf3REG_PKT_SNR_VALUE_7XTb4b4b4)Tb4b4b4; Tb4b4b4}

Tffa657float Te6edf3ISR_VECT Te6edf3sx127xTff7b72:Tff7b72:Te6edf3packetSnrTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Tb4b4b4(Tb4b4b4(Tffa657int8_tTb4b4b4)Te6edf3readRegisterTb4b4b4(Te6edf3REG_PKT_SNR_VALUE_7XTb4b4b4)Tb4b4b4) Tff7b72* T79c0ff0.25Tb4b4b4; Tb4b4b4}

Tffa657long Te6edf3sx127xTff7b72:Tff7b72:Te6edf3packetFrequencyErrorTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int32_t Te6edf3freqError Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3freqError Tff7b72= Tff7b72static_castTff7b72<Tffa657int32_tTff7b72>Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_FREQ_ERROR_MSB_7XTb4b4b4) Tff7b72& Te6edf3B111Tb4b4b4)Tb4b4b4;
Te6edf3freqError Tff7b72<Tff7b72<Tff7b72= T79c0ff8LTb4b4b4;
Te6edf3freqError Tff7b72+Tff7b72= Tff7b72static_castTff7b72<Tffa657int32_tTff7b72>Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_FREQ_ERROR_MID_7XTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3freqError Tff7b72<Tff7b72<Tff7b72= T79c0ff8LTb4b4b4;
Te6edf3freqError Tff7b72+Tff7b72= Tff7b72static_castTff7b72<Tffa657int32_tTff7b72>Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_FREQ_ERROR_LSB_7XTb4b4b4)Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_FREQ_ERROR_MSB_7XTb4b4b4) Tff7b72& Te6edf3B1000Tb4b4b4) Tb4b4b4{ T8b949e// Sign bit is on
Te6edf3freqError Tff7b72-Tff7b72= T79c0ff524288Tb4b4b4; T8b949e// B1000'0000'0000'0000'0000
Tb4b4b4}

Tff7b72const Tffa657float Te6edf3fXtal Tff7b72= T79c0ff32E6Tb4b4b4; T8b949e// FXOSC: crystal oscillator (XTAL) frequency (2.5. Chip Specification, p. 14)
Tff7b72const Tffa657float Te6edf3fError Tff7b72= Tb4b4b4(Tb4b4b4(Tff7b72static_castTff7b72<Tffa657floatTff7b72>Tb4b4b4(Te6edf3freqErrorTb4b4b4) Tff7b72* Tb4b4b4(T79c0ff1L Tff7b72<Tff7b72< T79c0ff24Tb4b4b4)Tb4b4b4) Tff7b72/ Te6edf3fXtalTb4b4b4) Tff7b72* Tb4b4b4(Te6edf3getSignalBandwidthTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff500000.0fTb4b4b4)Tb4b4b4;

Tff7b72return Tff7b72static_castTff7b72<Tffa657longTff7b72>Tb4b4b4(Te6edf3fErrorTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657size_t Te6edf3sx127xTff7b72:Tff7b72:Te6edf3writeTb4b4b4(Tffa657uint8_t Te6edf3byteTb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3writeTb4b4b4(Tff7b72&Te6edf3byteTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3byteTb4b4b4)Tb4b4b4)Tb4b4b4; Tb4b4b4}

Tffa657size_t Te6edf3sx127xTff7b72:Tff7b72:Te6edf3writeTb4b4b4(Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3bufferTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3currentLength Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_PAYLOAD_LENGTH_7XTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3currentLength Tff7b72+ Te6edf3sizeTb4b4b4) Tff7b72> Te6edf3MAX_PKT_LENGTHTb4b4b4) Tb4b4b4{ Te6edf3size Tff7b72= Te6edf3MAX_PKT_LENGTH Tff7b72- Te6edf3currentLengthTb4b4b4; Tb4b4b4}

Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3sizeTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FIFO_7XTb4b4b4, Te6edf3bufferTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4; Tb4b4b4}
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_PAYLOAD_LENGTH_7XTb4b4b4, Te6edf3currentLength Tff7b72+ Te6edf3sizeTb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3sizeTb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3ISR_VECT Te6edf3sx127xTff7b72:Tff7b72:Te6edf3availableTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_RX_NB_BYTES_7XTb4b4b4) Tff7b72- Te6edf3_packetIndexTb4b4b4)Tb4b4b4; Tb4b4b4}

Tffa657int Te6edf3ISR_VECT Te6edf3sx127xTff7b72:Tff7b72:Te6edf3readTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Tff7b72return T79c0ff-1Tb4b4b4; Tb4b4b4}
Te6edf3_packetIndexTff7b72+Tff7b72+Tb4b4b4;
Tff7b72return Te6edf3readRegisterTb4b4b4(Te6edf3REG_FIFO_7XTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657int Te6edf3sx127xTff7b72:Tff7b72:Te6edf3peekTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Tff7b72return T79c0ff-1Tb4b4b4; Tb4b4b4}

T8b949e// Remember current FIFO address, read, and then reset address
Tffa657int Te6edf3currentAddress Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_FIFO_ADDR_PTR_7XTb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3b Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_FIFO_7XTb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FIFO_ADDR_PTR_7XTb4b4b4, Te6edf3currentAddressTb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3bTb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3onReceiveTb4b4b4(Tffa657voidTb4b4b4(Tff7b72*Te6edf3callbackTb4b4b4)Tb4b4b4(Tffa657intTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_onReceive Tff7b72= Te6edf3callbackTb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3callbackTb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_dio0Tb4b4b4, Te6edf3INPUTTb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_DIO_MAPPING_1_7XTb4b4b4, T79c0ff0x00Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef SPI_HAS_NOTUSINGINTERRUPT
Te6edf3SPITb4b4b4.Te6edf3usingInterruptTb4b4b4(Te6edf3digitalPinToInterruptTb4b4b4(Te6edf3_dio0Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3attachInterruptTb4b4b4(Te6edf3digitalPinToInterruptTb4b4b4(Te6edf3_dio0Tb4b4b4)Tb4b4b4, Te6edf3sx127xTff7b72:Tff7b72:Te6edf3onDio0RiseTb4b4b4, Te6edf3RISINGTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3detachInterruptTb4b4b4(Te6edf3digitalPinToInterruptTb4b4b4(Te6edf3_dio0Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef SPI_HAS_NOTUSINGINTERRUPT
Te6edf3SPITb4b4b4.Te6edf3notUsingInterruptTb4b4b4(Te6edf3digitalPinToInterruptTb4b4b4(Te6edf3_dio0Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3receiveTb4b4b4(Tffa657int Te6edf3sizeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3size Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3implicitHeaderModeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_PAYLOAD_LENGTH_7XTb4b4b4, Te6edf3size Tff7b72& T79c0ff0xffTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{ Te6edf3explicitHeaderModeTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}

Te6edf3writeRegisterTb4b4b4(Te6edf3REG_OP_MODE_7XTb4b4b4, Te6edf3MODE_LONG_RANGE_MODE_7X Tff7b72| Te6edf3MODE_RX_CONTINUOUS_7XTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3setTxPowerTb4b4b4(Tffa657int Te6edf3levelTb4b4b4, Tffa657int Te6edf3outputPinTb4b4b4) Tb4b4b4{
T8b949e// Setup according to RFO or PA_BOOST output pin
Tff7b72if Tb4b4b4(Te6edf3PA_OUTPUT_RFO_PIN Tff7b72=Tff7b72= Te6edf3outputPinTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72< T79c0ff0Tb4b4b4) Tb4b4b4{ Te6edf3level Tff7b72= T79c0ff0Tb4b4b4; Tb4b4b4}
Tff7b72else Tff7b72if Tb4b4b4(Te6edf3level Tff7b72> T79c0ff14Tb4b4b4) Tb4b4b4{ Te6edf3level Tff7b72= T79c0ff14Tb4b4b4; Tb4b4b4}

Te6edf3writeRegisterTb4b4b4(Te6edf3REG_PA_DAC_7XTb4b4b4, T79c0ff0x84Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_PA_CONFIG_7XTb4b4b4, T79c0ff0x70 Tff7b72| Te6edf3levelTb4b4b4)Tb4b4b4;

Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72< T79c0ff2Tb4b4b4) Tb4b4b4{ Te6edf3level Tff7b72= T79c0ff2Tb4b4b4; Tb4b4b4}
Tff7b72else Tff7b72if Tb4b4b4(Te6edf3level Tff7b72> T79c0ff17Tb4b4b4) Tb4b4b4{ Te6edf3level Tff7b72= T79c0ff17Tb4b4b4; Tb4b4b4}

Te6edf3writeRegisterTb4b4b4(Te6edf3REG_PA_DAC_7XTb4b4b4, T79c0ff0x84Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_PA_CONFIG_7XTb4b4b4, Te6edf3PA_BOOST_7X Tff7b72| Tb4b4b4(Te6edf3level Tff7b72- T79c0ff2Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657uint8_t Te6edf3sx127xTff7b72:Tff7b72:Te6edf3getTxPowerTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3byte Te6edf3txp Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_PA_CONFIG_7XTb4b4b4)Tb4b4b4; Tff7b72return Te6edf3txpTb4b4b4; Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3setFrequencyTb4b4b4(Tffa657unsigned Tffa657long Te6edf3frequencyTb4b4b4) Tb4b4b4{
Te6edf3_frequency Tff7b72= Te6edf3frequencyTb4b4b4;
Tffa657uint32_t Te6edf3frf Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657uint64_tTb4b4b4)Te6edf3frequency Tff7b72<Tff7b72< T79c0ff19Tb4b4b4) Tff7b72/ T79c0ff32000000Tb4b4b4;

Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FRF_MSB_7XTb4b4b4, Tb4b4b4(Tffa657uint8_tTb4b4b4)Tb4b4b4(Te6edf3frf Tff7b72>Tff7b72> T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FRF_MID_7XTb4b4b4, Tb4b4b4(Tffa657uint8_tTb4b4b4)Tb4b4b4(Te6edf3frf Tff7b72>Tff7b72> T79c0ff8Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FRF_LSB_7XTb4b4b4, Tb4b4b4(Tffa657uint8_tTb4b4b4)Tb4b4b4(Te6edf3frf Tff7b72>Tff7b72> T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4;

Te6edf3optimizeModemSensitivityTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657uint32_t Te6edf3sx127xTff7b72:Tff7b72:Te6edf3getFrequencyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3msb Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_FRF_MSB_7XTb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3mid Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_FRF_MID_7XTb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3lsb Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_FRF_LSB_7XTb4b4b4)Tb4b4b4;

Tffa657uint32_t Te6edf3frf Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3msb Tff7b72<Tff7b72< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3mid Tff7b72<Tff7b72< T79c0ff8Tb4b4b4) Tff7b72| Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3lsbTb4b4b4;
Tffa657uint64_t Te6edf3frm Tff7b72= Tb4b4b4(Tffa657uint64_tTb4b4b4)Te6edf3frfTff7b72*T79c0ff32000000Tb4b4b4;
Tffa657uint32_t Te6edf3frequency Tff7b72= Tb4b4b4(Te6edf3frm Tff7b72>Tff7b72> T79c0ff19Tb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3frequencyTb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3setSpreadingFactorTb4b4b4(Tffa657int Te6edf3sfTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72< T79c0ff6Tb4b4b4) Tb4b4b4{ Te6edf3sf Tff7b72= T79c0ff6Tb4b4b4; Tb4b4b4}
Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72> T79c0ff12Tb4b4b4) Tb4b4b4{ Te6edf3sf Tff7b72= T79c0ff12Tb4b4b4; Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72=Tff7b72= T79c0ff6Tb4b4b4) Tb4b4b4{
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_DETECTION_OPTIMIZE_7XTb4b4b4, T79c0ff0xc5Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_DETECTION_THRESHOLD_7XTb4b4b4, T79c0ff0x0cTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_DETECTION_OPTIMIZE_7XTb4b4b4, T79c0ff0xc3Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_DETECTION_THRESHOLD_7XTb4b4b4, T79c0ff0x0aTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_2_7XTb4b4b4, Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_2_7XTb4b4b4) Tff7b72& T79c0ff0x0fTb4b4b4) Tff7b72| Tb4b4b4(Tb4b4b4(Te6edf3sf Tff7b72<Tff7b72< T79c0ff4Tb4b4b4) Tff7b72& T79c0ff0xf0Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3handleLowDataRateTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657long Te6edf3sx127xTff7b72:Tff7b72:Te6edf3getSignalBandwidthTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3byte Te6edf3bw Tff7b72= Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4) Tff7b72>Tff7b72> T79c0ff4Tb4b4b4)Tb4b4b4;
Tff7b72switch Tb4b4b4(Te6edf3bwTb4b4b4) Tb4b4b4{
Tff7b72case T79c0ff0Tb4b4b4: Tff7b72return T79c0ff7.8E3Tb4b4b4;
Tff7b72case T79c0ff1Tb4b4b4: Tff7b72return T79c0ff10.4E3Tb4b4b4;
Tff7b72case T79c0ff2Tb4b4b4: Tff7b72return T79c0ff15.6E3Tb4b4b4;
Tff7b72case T79c0ff3Tb4b4b4: Tff7b72return T79c0ff20.8E3Tb4b4b4;
Tff7b72case T79c0ff4Tb4b4b4: Tff7b72return T79c0ff31.25E3Tb4b4b4;
Tff7b72case T79c0ff5Tb4b4b4: Tff7b72return T79c0ff41.7E3Tb4b4b4;
Tff7b72case T79c0ff6Tb4b4b4: Tff7b72return T79c0ff62.5E3Tb4b4b4;
Tff7b72case T79c0ff7Tb4b4b4: Tff7b72return T79c0ff125E3Tb4b4b4;
Tff7b72case T79c0ff8Tb4b4b4: Tff7b72return T79c0ff250E3Tb4b4b4;
Tff7b72case T79c0ff9Tb4b4b4: Tff7b72return T79c0ff500E3Tb4b4b4; Tb4b4b4}

Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3setSignalBandwidthTb4b4b4(Tffa657long Te6edf3sbwTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3bwTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff7.8E3Tb4b4b4) Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff10.4E3Tb4b4b4) Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff1Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff15.6E3Tb4b4b4) Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff2Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff20.8E3Tb4b4b4) Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff3Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff31.25E3Tb4b4b4) Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff4Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff41.7E3Tb4b4b4) Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff5Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff62.5E3Tb4b4b4) Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff6Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff125E3Tb4b4b4) Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff7Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff250E3Tb4b4b4) Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff8Tb4b4b4;
Tb4b4b4} Tff7b72else T8b949e/*if (sbw <= 250E3)*/ Tb4b4b4{
Te6edf3bw Tff7b72= T79c0ff9Tb4b4b4;
Tb4b4b4}

Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4, Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4) Tff7b72& T79c0ff0x0fTb4b4b4) Tff7b72| Tb4b4b4(Te6edf3bw Tff7b72<Tff7b72< T79c0ff4Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3handleLowDataRateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3optimizeModemSensitivityTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3setCodingRate4Tb4b4b4(Tffa657int Te6edf3denominatorTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3denominator Tff7b72< T79c0ff5Tb4b4b4) Tb4b4b4{ Te6edf3denominator Tff7b72= T79c0ff5Tb4b4b4; Tb4b4b4}
Tff7b72else Tff7b72if Tb4b4b4(Te6edf3denominator Tff7b72> T79c0ff8Tb4b4b4) Tb4b4b4{ Te6edf3denominator Tff7b72= T79c0ff8Tb4b4b4; Tb4b4b4}
Tffa657int Te6edf3cr Tff7b72= Te6edf3denominator Tff7b72- T79c0ff4Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4, Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4) Tff7b72& T79c0ff0xf1Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3cr Tff7b72<Tff7b72< T79c0ff1Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3sx127xTff7b72:Tff7b72:Te6edf3setPreambleLengthTb4b4b4(Tffa657long Te6edf3preamble_symbolsTb4b4b4) Tb4b4b4{
Tffa657long Te6edf3length Tff7b72= Te6edf3preamble_symbols Tff7b72- T79c0ff4Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_PREAMBLE_MSB_7XTb4b4b4, Tb4b4b4(Tffa657uint8_tTb4b4b4)Tb4b4b4(Te6edf3length Tff7b72>Tff7b72> T79c0ff8Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_PREAMBLE_LSB_7XTb4b4b4, Tb4b4b4(Tffa657uint8_tTb4b4b4)Tb4b4b4(Te6edf3length Tff7b72>Tff7b72> T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72extern Tffa657bool Te6edf3lora_low_datarateTb4b4b4;
Tffa657void Td2a8ffsx127x::handleLowDataRateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3sf Tff7b72= Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_2_7XTb4b4b4) Tff7b72>Tff7b72> T79c0ff4Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4( Tffa657longTb4b4b4( Tb4b4b4(T79c0ff1Tff7b72<Tff7b72<Te6edf3sfTb4b4b4) Tff7b72/ Tb4b4b4(Te6edf3getSignalBandwidthTb4b4b4(Tb4b4b4)Tff7b72/T79c0ff1000Tb4b4b4)Tb4b4b4) Tff7b72> T79c0ff16Tb4b4b4) Tb4b4b4{
T8b949e// Set auto AGC and LowDataRateOptimize
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_3_7XTb4b4b4, Tb4b4b4(T79c0ff1Tff7b72<Tff7b72<T79c0ff3Tb4b4b4)Tff7b72|Tb4b4b4(T79c0ff1Tff7b72<Tff7b72<T79c0ff2Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lora_low_datarate Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Only set auto AGC
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_3_7XTb4b4b4, Tb4b4b4(T79c0ff1Tff7b72<Tff7b72<T79c0ff2Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lora_low_datarate Tff7b72= Tffa657falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Td2a8ffsx127x::optimizeModemSensitivityTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3byte Te6edf3bw Tff7b72= Tb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3REG_MODEM_CONFIG_1_7XTb4b4b4) Tff7b72>Tff7b72> T79c0ff4Tb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3freq Tff7b72= Te6edf3getFrequencyTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3bw Tff7b72=Tff7b72= T79c0ff9 Tff7b72&Tff7b72& Tb4b4b4(T79c0ff410E6 Tff7b72<Tff7b72= Te6edf3freqTb4b4b4) Tff7b72&Tff7b72& Tb4b4b4(Te6edf3freq Tff7b72<Tff7b72= T79c0ff525E6Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_HIGH_BW_OPTIMIZE_1_7XTb4b4b4, T79c0ff0x02Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_HIGH_BW_OPTIMIZE_2_7XTb4b4b4, T79c0ff0x7fTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3bw Tff7b72=Tff7b72= T79c0ff9 Tff7b72&Tff7b72& Tb4b4b4(T79c0ff820E6 Tff7b72<Tff7b72= Te6edf3freqTb4b4b4) Tff7b72&Tff7b72& Tb4b4b4(Te6edf3freq Tff7b72<Tff7b72= T79c0ff1020E6Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_HIGH_BW_OPTIMIZE_1_7XTb4b4b4, T79c0ff0x02Tb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_HIGH_BW_OPTIMIZE_2_7XTb4b4b4, T79c0ff0x64Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_HIGH_BW_OPTIMIZE_1_7XTb4b4b4, T79c0ff0x03Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Te6edf3ISR_VECT Td2a8ffsx127x::handleDio0RiseTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3irqFlags Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_IRQ_FLAGS_7XTb4b4b4)Tb4b4b4;

T8b949e// Clear IRQs
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_IRQ_FLAGS_7XTb4b4b4, Te6edf3irqFlagsTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3irqFlags Tff7b72& Te6edf3IRQ_PAYLOAD_CRC_ERROR_MASK_7XTb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3_packetIndex Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3packetLength Tff7b72= Te6edf3_implicitHeaderMode Tff7b72? Te6edf3readRegisterTb4b4b4(Te6edf3REG_PAYLOAD_LENGTH_7XTb4b4b4) Tff7b72: Te6edf3readRegisterTb4b4b4(Te6edf3REG_RX_NB_BYTES_7XTb4b4b4)Tb4b4b4;
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FIFO_ADDR_PTR_7XTb4b4b4, Te6edf3readRegisterTb4b4b4(Te6edf3REG_FIFO_RX_CURRENT_ADDR_7XTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_onReceiveTb4b4b4) Tb4b4b4{ Te6edf3_onReceiveTb4b4b4(Te6edf3packetLengthTb4b4b4)Tb4b4b4; Tb4b4b4}
Te6edf3writeRegisterTb4b4b4(Te6edf3REG_FIFO_ADDR_PTR_7XTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Te6edf3ISR_VECT Td2a8ffsx127x::onDio0RiseTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3sx127x_modemTb4b4b4.Te6edf3handleDio0RiseTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}

Te6edf3sx127x Te6edf3sx127x_modemTb4b4b4;

Tff7b72#Tff7b72endif


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────